import { useUser } from "@/stores/useUser";
import { useEquip } from "@/stores/useEquip";
import { systemTaskReset, systemTaskRun } from "@/common/system";
import { isRegistered, equipSocketInit, equipSocketPingPong, equipSocketClose } from "@/services/equip-socket";
import { readEquipAO } from "./equip";
import { userLogin } from "../apis/auth";

let timer: NodeJS.Timeout | null = null;
let isUserInited = false; // 用户是否已完成初始化
let isEquipInited = false; // 设备是否已完成初始化

// 初始化用户
export const userInit = () => {
    return new Promise(async (resolve, reject) => {
        const userStore = useUser();
        let { data: tokenData } = await userLogin({ clientType: "Tmp_", passwordKey: "-", userName: "昊泰气体", password: "123123" });
        if (tokenData.code == 200) {
            userStore.setState({ accessToken: tokenData.data.accesstoken, refreshToken: tokenData.data.refreshToken });
            userStore
                .syncToken()
                .then(async () => {
                    await userStore.syncUserInfo();
                    // userStore.syncProcesses();
                    // userStore.syncCameras().catch(() => {});
                    isUserInited = true;
                    resolve(null);
                })
                .catch(() => reject());
        } else reject();
    });
};
// 初始化设备
export const equipInit = () => {
    return new Promise(async (resolve) => {
        isEquipInited = false;
        const equipStore = useEquip();
        equipStore.restoreState();
        await Promise.all([equipStore.syncEquipsType(), equipStore.syncEquipsInfo(), equipStore.syncEquipsRegData()]);
        // await equipStore.syncEquipsAccess();
        equipStore.computedEquips();
        equipStore.setState({ groupsName: equipStore.equipsInfoGroup.length ? equipStore.equipsInfoGroup.map((v) => v.groupName) : ["新分组"] });
        console.log("equipState", equipStore.equipsType, equipStore.equipsInfo);
        isEquipInited = true;
        resolve(null);
    });
};
// 初始化服务
export const serviceInit = () => {
    return new Promise(async (resolve) => {
        const equipStore = useEquip();
        equipSocketInit();
        await onEquipSocketInited();
        equipStore.equipsInfo.forEach((v) => readEquipAO({ funid: v.fUNID }));
        !timer && (timer = setInterval(() => intervalTask(), 1000));
        resolve(null);
        function intervalTask() {
            try {
                systemTaskRun();
                equipSocketPingPong();
            } catch (err: any) {
                console.error("IntervalTask Error: " + err);
            }
        }
    });
};
// 已登录钩子
export const onUserInited = () => {
    return new Promise((resolve) => {
        fn();
        function fn() {
            if (isUserInited) resolve(null);
            else setTimeout(() => fn(), 500);
        }
    });
};
// 设备初始化完毕钩子
export const onEquipInited = () => {
    return new Promise((resolve) => {
        fn();
        function fn() {
            if (isEquipInited) resolve(null);
            else setTimeout(() => fn(), 500);
        }
    });
};
// 设备socket初始化完成钩子
export const onEquipSocketInited = () => {
    return new Promise((resolve) => {
        fn();
        function fn() {
            if (isRegistered) resolve(null);
            else setTimeout(() => fn(), 500);
        }
    });
};
// 恢复系统
export const restoreSystem = () => {
    const userStore = useUser();
    const equipStore = useEquip();
    userStore.restoreState();
    equipStore.restoreState();
    systemTaskReset();
    equipSocketClose();
    timer && clearInterval(timer);
    timer = null;
};
